Program example71;

{$mode objfpc}

{ This program demonstrates the Format function }

Uses sysutils;

Var
  P : Pointer;
  fmt, S : string;

{ Expected output:
        [%d] => [10]
        [%%] => [%]
      [%10d] => [        10]
      [%.4d] => [0010]
    [%10.4d] => [      0010]
      [%0:d] => [10]
    [%0:10d] => [        10]
  [%0:10.4d] => [      0010]
   [%0:-10d] => [10        ]
 [%0:-10.4d] => [0010      ]
    [%-*.*d] => [00010]
}
Procedure TestInteger;
begin
  Try
    Fmt := '[%d]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%%]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10d]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    fmt := '[%.4d]';
    S := Format (fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10.4d]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:d]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10d]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10.4d]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10d]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10.4d]';
    S := Format (fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%-*.*d]';
    S := Format (fmt, [4, 5, 10]);
    writeln(Fmt: 12, ' => ', s);
  except
    On E : Exception do
    begin
      Writeln ('Exception caught : ', E.Message);
    end;
  end;
  writeln ('Press enter');
  readln;
end;

{ Expected output:
        [%x] => [A]
      [%10x] => [         A]
    [%10.4x] => [      000A]
      [%0:x] => [A]
    [%0:10x] => [         A]
  [%0:10.4x] => [      000A]
   [%0:-10x] => [A         ]
 [%0:-10.4x] => [000A      ]
    [%-*.*x] => [0000A]
}
Procedure TestHexaDecimal;
begin
  try
    Fmt := '[%x]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10x]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10.4x]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:x]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10x]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10.4x]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10x]';
    S := Format (Fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10.4x]';
    S := Format (fmt, [10]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%-*.*x]';
    S := Format (fmt, [4, 5, 10]);
    writeln(Fmt: 12, ' => ', s);
  except
    On E : Exception do
    begin
      Writeln ('Exception caught : ', E.Message);
    end;
  end;
  writeln ('Press enter');
  readln;
end;

{ Expected output:
      [0x%p] => [0x0012D687]
    [0x%10p] => [0x  0012D687]
  [0x%10.4p] => [0x  0012D687]
    [0x%0:p] => [0x0012D687]
  [0x%0:10p] => [0x  0012D687]
[0x%0:10.4p] => [0x  0012D687]
 [0x%0:-10p] => [0x0012D687  ]
[0x%0:-10.4p] => [0x0012D687  ]
    [%-*.*p] => [0012D687]
}
Procedure TestPointer;
begin
  P := Pointer(1234567);
  try
    Fmt := '[0x%p]';
    S := Format (Fmt, [P]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[0x%10p]';
    S := Format (Fmt, [P]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[0x%10.4p]';
    S := Format (Fmt, [P]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[0x%0:p]';
    S := Format (Fmt, [P]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[0x%0:10p]';
    S := Format (Fmt, [P]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[0x%0:10.4p]';
    S := Format (Fmt, [P]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[0x%0:-10p]';
    S := Format (Fmt, [P]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[0x%0:-10.4p]';
    S := Format (fmt, [P]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%-*.*p]';
    S := Format (fmt, [4, 5, P]);
    writeln(Fmt: 12, ' => ', s);
  except
    On E : Exception do
    begin
      Writeln ('Exception caught : ', E.Message);
    end;
  end;
  writeln ('Press enter');
  readln;
end;

{ Expected output:
        [%s]=> [This is a string]
      [%0:s]=> [This is a string]
    [%0:18s]=> [  This is a string]
   [%0:-18s]=> [This is a string  ]
 [%0:18.12s]=> [      This is a st]
    [%-*.*s]=> [This is a st      ]
}
Procedure TestString;
begin
  try
    Fmt := '[%s]';
    S := Format(fmt, ['This is a string']);
    Writeln(fmt: 12, '=> ', s);
    fmt := '[%0:s]';
    s := Format(fmt, ['This is a string']);
    Writeln(fmt: 12, '=> ', s);
    fmt := '[%0:18s]';
    s := Format(fmt, ['This is a string']);
    Writeln(fmt: 12, '=> ', s);
    fmt := '[%0:-18s]';
    s := Format(fmt, ['This is a string']);
    Writeln(fmt: 12, '=> ', s);
    fmt := '[%0:18.12s]';
    s := Format(fmt, ['This is a string']);
    Writeln(fmt: 12, '=> ', s);
    fmt := '[%-*.*s]';
    s := Format(fmt, [18, 12, 'This is a string']);
    Writeln(fmt: 12, '=> ', s);
  except
    On E : Exception do
    begin
      Writeln ('Exception caught : ', E.Message);
    end;
  end;
  writeln ('Press enter');
  readln;
end;

{ Expected output:
        [%e] => [1.2340000000000000E+000]
      [%10e] => [1.2340000000000000E+000]
    [%10.4e] => [1.234E+000]
      [%0:e] => [1.2340000000000000E+000]
    [%0:10e] => [1.2340000000000000E+000]
  [%0:10.4e] => [1.234E+000]
   [%0:-10e] => [1.2340000000000000E+000]
 [%0:-10.4e] => [1.234E+000]
    [%-*.*e] => [1.2340E+000]
}
Procedure TestExponential;
begin
  Try
    Fmt := '[%e]';
    S := Format (Fmt, [1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10e]';
    S := Format (Fmt, [1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10.4e]';
    S := Format (Fmt, [1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:e]';
    S := Format (Fmt, [1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10e]';
    S := Format (Fmt, [1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10.4e]';
    S := Format (Fmt, [1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10e]';
    S := Format (Fmt, [1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10.4e]';
    S := Format (fmt, [1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%-*.*e]';
    S := Format (fmt, [4, 5, 1.234]);
    writeln(Fmt: 12, ' => ', s);
  except
    On E : Exception do
    begin
      Writeln ('Exception caught : ', E.Message);
    end;
  end;
  writeln ('Press enter');
  readln;
end;

{ Expected output:
        [%e] => [-1.2340000000000000E+000]
      [%10e] => [-1.2340000000000000E+000]
    [%10.4e] => [-1.234E+000]
      [%0:e] => [-1.2340000000000000E+000]
    [%0:10e] => [-1.2340000000000000E+000]
  [%0:10.4e] => [-1.234E+000]
   [%0:-10e] => [-1.2340000000000000E+000]
 [%0:-10.4e] => [-1.234E+000]
    [%-*.*e] => [-1.2340E+000]
}
Procedure TestNegativeExponential;
begin
  Try
    Fmt := '[%e]';
    S := Format (Fmt, [-1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10e]';
    S := Format (Fmt, [-1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10.4e]';
    S := Format (Fmt, [-1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:e]';
    S := Format (Fmt, [-1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10e]';
    S := Format (Fmt, [-1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10.4e]';
    S := Format (Fmt, [-1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10e]';
    S := Format (Fmt, [-1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10.4e]';
    S := Format (fmt, [-1.234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%-*.*e]';
    S := Format (fmt, [4, 5, -1.234]);
    writeln(Fmt: 12, ' => ', s);
  except
    On E : Exception do
    begin
      Writeln ('Exception caught : ', E.Message);
    end;
  end;
  writeln ('Press enter');
  readln;
end;

{ Expected output:
        [%e] => [1.2340000000000000E-002]
      [%10e] => [1.2340000000000000E-002]
    [%10.4e] => [1.234E-002]
      [%0:e] => [1.2340000000000000E-002]
    [%0:10e] => [1.2340000000000000E-002]
  [%0:10.4e] => [1.234E-002]
   [%0:-10e] => [1.2300000000000000E-002]
 [%0:-10.4e] => [1.234E-002]
    [%-*.*e] => [1.2340E-002]
}
Procedure TestSmallExponential;
begin
  Try
    Fmt := '[%e]';
    S := Format (Fmt, [0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10e]';
    S := Format (Fmt, [0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10.4e]';
    S := Format (Fmt, [0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:e]';
    S := Format (Fmt, [0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10e]';
    S := Format (Fmt, [0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10.4e]';
    S := Format (Fmt, [0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10e]';
    S := Format (Fmt, [0.0123]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10.4e]';
    S := Format (fmt, [0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%-*.*e]';
    S := Format (fmt, [4, 5, 0.01234]);
    writeln(Fmt: 12, ' => ', s);
  except
    On E : Exception do
    begin
      Writeln ('Exception caught : ', E.Message);
    end;
  end;
  writeln ('Press enter');
  readln;
end;

{ Expected output:
        [%e] => [-1.2340000000000000E-002]
      [%10e] => [-1.2340000000000000E-002]
    [%10.4e] => [-1.234E-002]
      [%0:e] => [-1.2340000000000000E-002]
    [%0:10e] => [-1.2340000000000000E-002]
  [%0:10.4e] => [-1.234E-002]
   [%0:-10e] => [-1.2340000000000000E-002]
 [%0:-10.4e] => [-1.234E-002]
    [%-*.*e] => [-1.2340E-002]
}
Procedure TestSmallNegExponential;
begin
  Try
    Fmt := '[%e]';
    S := Format (Fmt, [-0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10e]';
    S := Format (Fmt, [-0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%10.4e]';
    S := Format (Fmt, [-0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:e]';
    S := Format (Fmt, [-0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10e]';
    S := Format (Fmt, [-0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:10.4e]';
    S := Format (Fmt, [-0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10e]';
    S := Format (Fmt, [-0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%0:-10.4e]';
    S := Format (fmt, [-0.01234]);
    writeln(Fmt: 12, ' => ', s);
    Fmt := '[%-*.*e]';
    S := Format (fmt, [4, 5, -0.01234]);
    writeln(Fmt: 12, ' => ', s);
  except
    On E : Exception do
    begin
      Writeln ('Exception caught : ', E.Message);
    end;
  end;
  writeln ('Press enter');
  readln;
end;

begin
  TestInteger;
  TestHexadecimal;
  TestPointer;
  teststring;
  TestExponential;
  TestNegativeExponential;
  TestSmallExponential;
  TestSmallNegExponential;
end.